From 5d27ed6a1ff944b5bb1c4d428386593d612fdc71 Mon Sep 17 00:00:00 2001 From: Andres Lagar-Cavilla Date: Thu, 29 Mar 2012 12:01:33 +0100 Subject: [PATCH] x86/mm: Make iommu passthrough and mem paging/sharing mutually exclusive Regardless of table sharing or processor vendor, these features cannot coexist since iommu's don't expect gfn->mfn mappings to change, and sharing and paging depend on trapping all accesses. Signed-off-by: Andres Lagar-Cavilla Acked-by: Tim Deegan Committed-by: Tim Deegan --- xen/arch/x86/mm/mem_event.c | 4 ++++ xen/arch/x86/mm/mem_sharing.c | 5 ++++- xen/drivers/passthrough/iommu.c | 7 +++++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/xen/arch/x86/mm/mem_event.c b/xen/arch/x86/mm/mem_event.c index 4e01c7ff21..f15293fe4d 100644 --- a/xen/arch/x86/mm/mem_event.c +++ b/xen/arch/x86/mm/mem_event.c @@ -567,7 +567,11 @@ int mem_event_domctl(struct domain *d, xen_domctl_mem_event_op_t *mec, if ( boot_cpu_data.x86_vendor != X86_VENDOR_INTEL ) break; + /* No paging if iommu is used */ rc = -EXDEV; + if ( unlikely(need_iommu(d)) ) + break; + /* Disallow paging in a PoD guest */ if ( p2m->pod.entry_count ) break; diff --git a/xen/arch/x86/mm/mem_sharing.c b/xen/arch/x86/mm/mem_sharing.c index 1456de55d7..c838fd848f 100644 --- a/xen/arch/x86/mm/mem_sharing.c +++ b/xen/arch/x86/mm/mem_sharing.c @@ -1205,8 +1205,11 @@ int mem_sharing_domctl(struct domain *d, xen_domctl_mem_sharing_op_t *mec) { case XEN_DOMCTL_MEM_SHARING_CONTROL: { - d->arch.hvm_domain.mem_sharing_enabled = mec->u.enable; rc = 0; + if ( unlikely(need_iommu(d) && mec->u.enable) ) + rc = -EXDEV; + else + d->arch.hvm_domain.mem_sharing_enabled = mec->u.enable; } break; diff --git a/xen/drivers/passthrough/iommu.c b/xen/drivers/passthrough/iommu.c index 82488d3e9f..4aefd91a05 100644 --- a/xen/drivers/passthrough/iommu.c +++ b/xen/drivers/passthrough/iommu.c @@ -205,6 +205,13 @@ static int assign_device(struct domain *d, u16 seg, u8 bus, u8 devfn) if ( !iommu_enabled || !hd->platform_ops ) return 0; + /* Prevent device assign if mem paging or mem sharing have been + * enabled for this domain */ + if ( unlikely(!need_iommu(d) && + (d->arch.hvm_domain.mem_sharing_enabled || + d->mem_event->paging.ring_page)) ) + return -EXDEV; + spin_lock(&pcidevs_lock); if ( (rc = hd->platform_ops->assign_device(d, seg, bus, devfn)) ) goto done; -- 2.30.2